0 REM" PONZO*82*WATERLOO 1 [143]" 1000 GOSUB60000:PRINT"[147] [159]GRAPHICS-1[159]" 1001 PRINT"[176][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][174]" 1002 PRINT"[221] [159] GRAPHICS AND STUFF [146] [221]":MS$=" WELCOME! " 1003 PRINT"[173][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][189]":GOSUB63100 1004 GOSUB63000 1005 PRINT"[147] THE VIDEO SCREEN" 1010 PRINT"LET'S FIND OUT HOW THE C64 DECIDES WHAT" 1020 PRINT"TO PUT IN ONE OF THE 1000 SCREEN" 1030 PRINT"LOCATIONS..SAY LOCATION #K." 1040 PRINT"(WHERE K=0 OR 1 OR 2 OR.. 999)" 1050 PRINT"1[146]:LOOK IN S[146]CREEN M[146]EMORY[146], IN LOCATION" 1060 PRINT" SM[146]+K, AND GET 1 BYTE:N (0<=N<=255)" 1070 PRINT"2[146][146]:LOOK IN C[146]HARACTER M[146]EMORY[146], IN" 1080 PRINT" LOCATIONS CM[146]+8*N,CM[146]+8*N+1,..CM[146]+8*N+7" 1090 PRINT" AND GET 8 BYTES:P,P+1,..,P+7." 1100 PRINT"3[146]:LOOK IN COLOUR MEMORY[146], IN LOCATION" 1110 PRINT" 55296+K, AND GET 1 NYBBLE:C (0<=C<=15)" 1120 GOSUB63000 1130 PRINT"[147]THEN, ARMED WITH 8 BYTES P,P+1,...,P+7" 1140 PRINT"AND 1 NYBBLE C (4 BITS), THE C64" 1150 PRINT"USES THE 64 BITS OF P,P+1,...,P+7" 1160 PRINT"TO DETERMINE WHICH 'DOTS' OR 'PIXELS'" 1170 PRINT"AT SCREEN LOCATION K ARE TO BE ON[146]" 1180 PRINT"AND WHICH ARE TURNED OFF[146]." 1190 PRINT"THE OFF[146] PIXELS ARE IN THE BACKGROUND[146]" 1200 PRINT"COLOUR, AND THE ON[146] PIXELS ARE IN" 1210 PRINT"THE COLOUR GIVEN BY THE NYBBLE C[146]!" 1220 GOSUB63000 1230 PRINT"[147]IF THE 8 BYTES P,P+1,...,P+7 TAKEN FROM" 1240 PRINT"CHARACTER MEMORY[146], WHICH STARTS AT CM[146]," 1250 PRINT"GIVE THE 'PIXEL PATTERN' FOR THE LETTER" 1260 PRINT"'P', AND THE NYBBLE TAKEN FROM COLOUR" 1270 PRINT"MEMORY[146], WHICH STARTS AT 55296, IS" 1280 PRINT"C='10' (LIGHT RED), A LIGHT RED 'P'" 1290 PRINT"WILL APPEAR ON THE SCREEN IN THE K'TH" 1300 PRINT"SCREEN POSITION.":MS$="1=ON[146] 0=OFF[146]":GOSUB63100:GOSUB63000 1310 PRINT"[147]'NORMALLY' SCREEN MEMORY[146] STARTS AT" 1320 PRINT"SM=1024[146]. THESE 1000 MEMORY LOCATIONS," 1330 PRINT"FROM 1024 TO 2023, HOLD 'CHARACTER" 1340 PRINT"NUMBERS'. IF THE LOCATION 1039 HOLDS" 1350 PRINT"N=17 THEN, SINCE 1039=1024+15 IS THE" 1360 PRINT"15'TH SCREEN POSITION, THIS 15'TH" 1370 PRINT"POSITION WILL DISPLAY THE 17'TH" 1380 PRINT"CHARACTER IN CHARACTER MEMORY[146]!" 1390 PRINT"(NOTE: SCREEN POSITIONS ARE NUMBERED" 1400 PRINT" 0,1,...999 SO #15 IS" 1405 PRINT" REALLY THE 16'TH POSITION!)":GOSUB63000 1410 PRINT"[147]'NORMALLY' CHARACTER MEMORY[146] STARTS AT" 1420 PRINT"CM=53248 IF YOU'RE USING 'UPPER CASE" 1430 PRINT"AND GRAPHICS', AND STARTS AT" 1440 PRINT"CM=55296 IF YOU'RE USING 'LOWER AND" 1450 PRINT"UPPER CASE'." 1451 PRINT"NOTE[157][157][157][157][184][184][184][184][145]:FROM 53248 TO 55295 IS 2K BYTES" 1452 PRINT" :FROM 55296 TO 57343 IS 2K BYTES" 1453 PRINT" (2K FOR EACH 'CHARACTER SET')" 1455 MS$=" I CM ":GOSUB63100:GOSUB63000 1460 PRINT"[147]HOW DO YOU KNOW WHAT 'SM' IS?" 1470 PRINT"(WHERE SCREEN MEMORY[146] STARTS?)": 1475 MS$=" GUESS!":GOSUB63100:GOSUB63000 1480 PRINT"[147]LOOK IN V+24[146], THE 24'TH REGISTER" 1490 PRINT"IN THE VIDEO CHIP[146].":MS$="53248+24! ":GOSUB63100:GOSUB63000 1500 PRINT"[147]HOW DO YOU KNOW WHAT 'CM' IS?" 1510 PRINT"(WHERE CHARACTER MEMORY[146] STARTS?)":MS$="CM=???????":GOSUB63100 1520 GOSUB63000: PRINT"[147]LOOK IN V+24[146], THE 24'TH REGISTER" 1530 PRINT"IN THE VIDEO CHIP[146].":MS$="53248+24!!":GOSUB63100:GOSUB63000 1540 PRINT"[147]IN FACT THIS REGISTER, V+24[146]," 1550 PRINT"(V=53248[146] IS THE 'START' OF THE " 1560 PRINT"VIDEO CHIP) IS 8 BITS WIDE (1 BYTE)" 1570 PRINT"AND THE UPPER 4 BITS[146] (NYBBLE) GIVES" 1580 PRINT"THE START OF SCREEN MEMORY[146], SM," 1590 PRINT"AND THE LOWER 4 BITS[146] GIVES THE" 1600 PRINT"START OF CHARACTER MEMORY[146], CM.":MS$="+":GOSUB63100 1610 GOSUB63000:PRINT"[147]SINCE 4 BITS CAN HAVE ONLY 16 VALUES" 1620 PRINT"THEN SCREEN MEMORY[146] CAN BE IN ONE OF" 1630 PRINT"16 POSSIBLE LOCATIONS, NAMELY:" 1640 PRINT"0,1024,2048,3072,4096,....,16384" 1650 PRINT"WHICH IS MORE EASILY THOUGHT OF AS" 1660 PRINT"1024 TIMES 0 OR 1 OR 2 ..OR 15." 1670 PRINT"SINCE SCREEN MEMORY[146] IS 'NORMALLY' AT" 1680 PRINT"1024 THEN THIS 'UPPER NYBBLE' CONTAINS" 1690 PRINT"'0001' IN BINARY OR '1' IN DECIMAL.":GOSUB63000 1700 PRINT"[147]SIMILARLY, CHARACTER MEMORY[146] CAN HAVE" 1710 PRINT"ONE OF 16 'STARTING ADDRESSES'..." 1720 PRINT"RIGHT?" 1725 MS$=" RIGHT[146]":GOSUB63100:GOSUB63000:PRINT"WRONG[146]!!!" 1730 PRINT"THE L[146]EAST S[146]IGNIFICANT B[146]IT IN V+24[146]" 1740 PRINT"ISN'T USED, SO THE 8[146] POSSIBLE" 1750 PRINT"LOWER NYBBLES IN V+24[146] ARE:" 1760 PRINT"000[214],001[214],010[214],011[214],100[214],101[214],110[214],111[214]" 1770 PRINT"EACH GIVING A DIFFERENT 'STARTING" 1780 PRINT"ADDRESS' FOR CHARACTER MEMORY[146],NAMELY:" 1790 PRINT"0,2048,4096,6144,....14336" 1800 PRINT"OR 2048*(0 OR 1 OR ... 7)":GOSUB63000 1810 PRINT"[147]'NORMALLY' CHARACTER MEMORY[146] IS AT" 1820 PRINT"CM=53248 (UPPER/GRAPHICS) OR" 1830 PRINT"CM=55296 (LOWER/UPPER) AND THE " 1840 PRINT"BIT PATTERNS 001[214] AND 011[214] WILL" 1850 PRINT"AUTOMATICALLY[146] SET CM=55396 OR CM=55296!" 1860 PRINT"ALSO YOU WON'T WANT TO USE 000[214] WHICH" 1870 PRINT"MEANS CM=0.(THE C64 NEEDS[146] THESE" 1880 PRINT"MEMORY LOCATIONS!)" 1890 PRINT"SO YOU CAN STORE 'PIXEL PATTERNS' AT:" 1900 PRINT"2048,8192,10240,12288 OR 14336":GOSUB63000 1910 PRINT"[147]IN FACT (!), EVEN SCREEN MEMORY[146] CAN" 1920 PRINT"NOT HAVE ALL 16 POSSIBLE 'STARTING" 1930 PRINT"POSITIONS'. THE BIT PATTERNS IN THE" 1940 PRINT"UPPER NYBBLE OF REGISTER V+24:" 1950 PRINT"0100,0101,0110,0111" 1960 PRINT"MEAN SCREEN MEMORY[146] AT:" 1970 PRINT"4096,5120,6144,7168" 1980 PRINT"AND THESE MEMORY LOCATIONS ARE NOT" 1990 PRINT"AVAILABLE FOR THE SCREEN!" 2000 PRINT"MORAL?":GOSUB63000 2010 PRINT"DO NOT USE 1024*(4 OR 5 OR 6)[146]!":GOSUB63000 2020 PRINT"[147]OK...SO YOU WANT TO 'DESIGN' YOUR" 2030 PRINT"OWN CHARACTER SET?" 2040 PRINT"JUST POINT THE VIDEO CHIP[146] TO" 2050 PRINT"YOUR[157][157][157][157][184][184][184][184][145] 'PIXEL PATTERNS'." 2060 PRINT"MAKE UP THE 'DOTS ON' AND 'DOTS OFF'" 2070 PRINT"WHICH DEFINE ALL 256 OR YOUR CHARACTERS" 2080 PRINT"& POKE THESE BITS (8-AT-ATIME=1 BYTE!) 2090 [153]"INTO CM,CM+1,...,CM+4095, CHOOSING" 2100 [153]"CMWAIT AS ONE OF THE AVAILABLE 'STARTING" 2110 [153]"ADDRESSES' FOR CHARACTER MEMORYWAIT" 2120 [153]"THEN TELL THE VIDEO CHIPWAIT BY" 2130 [153]"SETTING THE LOWER 4 BITS OF V+24WAIT.":[141]63000 2140 [153]"LOAD MULTI COLOUR MODE" 2150 [153]"SINCE COLOUR MEMORYWAIT HAS 1000 NYBBLES," 2160 [153]"ONE FOR EACH OF THE 1000 SCREEN POS'NS," 2170 [153]"THEN EACH CHARACTER ON THE SCREEN CAN" 2180 [153]"HAVE ONE OF 16 DIFFERENT COLOURS." 2190 [153]"(BUT ALL CHARACTERS SHARE THE SAME" 2200 [153]"'BACKGROUND COLOUR')." 2210 [153]"SUPPOSE YOU WANT MORE THAN 2WAIT COLOURS" 2220 [153]"WITHIN A SINGLE 'CURSOR POSITION'." 2230 [153]"THEN TELL THE VIDEO CHIPWAIT!":[141]63000 2240 [153]"LOADIN REGISTER V+22WAIT IS A MAGIC BIT," 2250 [153]"BIT 4WAIT, WHICH TURNS ON MULTI-COLOURWAIT." 2260 [153]"DON'T DISTURB THE OTHER BITS IN V+22WAIT" 2270 [153]"SO POKE V+22,PEEK(V+22)OR16WAIT." 2280 [153]"IN THIS MODE LET'S SEE HOW THE C64" 2290 [153]"DETERMINES WHAT TO PUT IN ONE OF THE" 2300 [153]"1000 SCREEN POSITIONS, SAY #K." 2310 [153]"(REMEMBER: K=0,1,2,....,999)":MS$[178]"K=0 IS 1ST":[141]63100 2320 [141]63000:[153]"LOAD1WAIT:LOOK IN SCREEN MEMORYWAIT AND GET" 2330 [153]" THE K'TH BYTE, SAY IT'S N." 2340 [153]"2WAIT:LOOK IN CHARACTER MEMORYWAIT," 2345 [153]" FROM CM+8*N TO CM+8*N+7" 2350 [153]" AND GET 8 BYTES: P,P+1,...,P+7." 2360 [153]"THE BITS IN P,P+1,...,P+7 DETERMINE" 2370 [153]"THE 'PIXEL ANDWAIT COLOUR PATTERN':" 2380 [153]"00WAIT SETS 2WAIT PIXELS TO COLOUR #0" 2390 [153]"01WAIT SETS 2WAIT PIXELS TO COLOUR #1" 2400 [153]"10WAIT SETS 2WAIT PIXELS TO COLOUR #2" 2410 [153]"11WAIT SETS 2WAIT PIXELS TO COLOUR #3":[141]63000:[153]"ONONON" 2420 [153]"?????????":[141]63000 2430 [153]"LOADLET'S SAY THAT AGAIN!" 2440 [153]"SUPPOSE THE FIRST BYTE,P,IS:" 2450 [153]"P=11 10 00 01 (IN BINARY)." 2460 [153]"THEN THE FIRST ROW OF PIXELS WILL BE:" 2470 [153]"CLR SYS   WAIT _SEE, 4 COLOURS!" 2480 [153]"NOTE THAT 'PIXEL ON' OR 'PIXEL OFF'" 2490 [153]"IS NO LONGER MEANINGFUL." 2500 [153]"THERE ARE 4WAIT POSSIBILITIES FOR" 2510 [153]"EACH PAIRWAIT OF PIXELS!" 2520 [153]"NOTE,TOO,THAT THE HORIZONTAL RESOLUTION" 2530 [153]"IS NOT AS 'DETAILED' AS IN 'NORMAL'" 2540 [153]"COLOUR MODE (BIT4=0)." 2550 [141]63000:[153]"LOADSUPPOSE THE NUMBER NWAIT READ FROM" 2560 [153]"SCREEN MEMORYWAIT IS A 1WAIT." 2570 [153]"THEN THE 8 BYTES READ FROM CM+8-CM+15," 2580 [153]"IN CHARACTER MEMORYWAIT, WILL HAVE THE" 2590 [153]"BIT PATTERN DEFINING THE LETTER 'A'." 2600 [153]"(IF 'NORMAL' CHAR. MEMORY:CM=53248)" 2610 [153]"NOTE:0='@',1='A',2='B', ETC. 2615 PRINT"THE SAME NUMBERS YOU 'POKE' TO" 2616 PRINT"SCREEN MEMORY[146] TO GET @,A,B.." 2617 PRINT"ON THE SCREEN!":GOSUB63000 2620 A$(0)="00011000 =P" 2630 A$(1)="00100100 =P+1" 2640 A$(2)="01000010 =P+2" 2650 A$(3)="01111110 =P+3" 2660 A$(4)="01000010 =P+4" 2670 A$(5)="01000010 =P+5" 2680 A$(6)="01000010 =P+6" 2690 A$(7)="00000000 =P+7" 2700 PRINT"[147]HERE ARE THE 8 BYTES FOR 'A':":FORI=0TO7:PRINTA$(I):NEXT 2710 PRINT"SEE THE LETTER 'A'?":GOSUB63000 2720 B$(0)=" [209][209] =P" 2730 B$(1)=" [209] [209] =P+1" 2740 B$(2)=" [209] [209] =P+2" 2750 B$(3)=" [209][209][209][209][209][209] =P+3" 2760 B$(4)=" [209] [209] =P+4" 2770 B$(5)=" [209] [209] =P+5" 2780 B$(6)=" [209] [209] =P+6" 2790 B$(7)=" =P+7" 2795 PRINT""; 2800 FORI=0TO7:PRINTB$(I):NEXT:MS$="NICE A,EH?":GOSUB63100:GOSUB63000 2810 PRINT"[147]";:FORI=0TO7:PRINTA$(I):NEXT 2815 PRINT"NOW, TAKEN IN PAIRS.." 2820 C$(0)="00[146]0110[146]00 =P" 2830 C$(1)="0010[146]0100[146] =P+1" 2840 C$(2)="01[146]0000[146]10 =P+2" 2850 C$(3)="0111[146]1110[146] =P+3" 2860 C$(4)="01[146]0000[146]10 =P+4" 2870 C$(5)="0100[146]0010[146] =P+5" 2880 C$(6)="01[146]0000[146]10 =P+6" 2890 C$(7)="0000[146]0000[146] =P+7" 2895 MS$="IN PEARS?":GOSUB63100 2900 GOSUB63000:PRINT"";:FORI=0TO7:PRINTC$(I):FORT=1TO500:NEXT:NEXT 2910 PRINT"DEPENDING UPON WHETHER THE 'BIT PAIRS' 2920 [153]"ARE 00WAIT OR 01WAIT OR 10WAIT OR 11WAIT" 2930 [153]"WE SET THE CORRESPONDING 'PIXEL PAIRS'" 2940 [153]"TO COLOUR #0 OR 1 OR 2 OR 3.":[141]63000 2950 [153]"";: 2960 D$(0)[178]" OPEN CLR  WAIT =P" 2970 D$(1)[178]" CLR OPEN  WAIT =P+1" 2980 D$(2)[178]"OPEN   CLR WAIT =P+2" 2990 D$(3)[178]"OPEN   CLR WAIT =P+3" 3000 D$(4)[178]"OPEN   CLR WAIT =P+4" 3010 D$(5)[178]"OPEN   CLR WAIT =P+5" 3020 D$(6)[178]"OPEN   CLR WAIT =P+6" 3030 D$(7)[178]"    WAIT =P+7" 3040 [129]I[178]0[164]7:[153]D$(I):[129]T[178]1[164]500:[130]:[130]:MS$[178]"LOOKS NICE":[141]63100 3050 [141]63000:[153]"LOAD";:[129]I[178]0[164]7:[153]D$(I):[130] 3060 [153]"....LOOK LIKE AN 'A'?" 3070 [153]"WELL, IT ISWAIT MADE UP OF 4WAIT COLOURS" 3080 [153]"AND THAT MAY BE WORTH THE LOSS IN" 3090 [153]"RESOLUTION." 3100 [153]"HOWEVER, YOU MAY WANT TO USE THIS" 3110 [153]"MULTI-COLOUR MODEWAIT FOR OTHER THAN TO" 3120 [153]"DISPLAY MULTI-COLOURED CHARACTERS!" 3130 [141]63000:[153]"LOADWHAT ARE THESE 'COLOUR #0' ETC,?"" 3140 PRINT"IN V+33[146] V+34[146] & V+35[146] ARE THE" 3150 PRINT"COLOURS #0,#1 & #2." 3160 PRINT"THE LOWER NYBBLE IN THESE VIDEO CHIP" 3170 PRINT"REGISTERS DEFINE THE 16 POSSIBLE " 3180 PRINT"COLOURS FOR THE 00[146] 01[146] & 10[146] BIT PAIRS." 3190 PRINT"SINCE V=53248[146] THEN V+33[146]=53281" 3200 PRINT"WHICH YOU MAY RECOGNIZE AS THE REGISTER" 3210 PRINT"GIVING THE 'BACKGROUND' COLOUR!":PRINT"(COLOUR #0=BACKGROUND)" 3220 GOSUB63000:PRINT"[147]NOTICE THAT, HAVING PICKED YOUR" 3230 PRINT"FAVOURITE COLOURS #0,1 & 2, ALL[146]" 3240 PRINT"THE CHARACTERS ON THE SCREEN SHARE" 3250 PRINT"THESE COLOURS!" 3260 PRINT"BUT[157][157][157][184][184][184][145]..EACH CHARACTER CAN HAVE" 3270 PRINT"IT'S OWN 'COLOUR #3'!" 3280 PRINT"(BUT!THERE ARE ONLY 8 TO CHOOSE FROM!)." 3290 PRINT"WHERE'S COLOUR #3???":MS$="MY COLOUR!":GOSUB63100:GOSUB63000 3300 PRINT"[147]IN COLOUR MEMORY[146]!!":MS$="WHAT ELSE!":GOSUB63100 3305 GOSUB63000:PRINT"[147]LET'S SEE HOW THAT WORKS:" 3310 PRINT"RECALL THAT COLOUR MEMORY[146] IS MADE" 3320 PRINT"UP OF 1000 NYBBLES, AT 55296." 3330 PRINT"THERE IS A 'NYBBLE' FOR EACH SCREEN" 3340 PRINT"POSITION. YOU MIGHT EXPECT THAT THERE" 3350 PRINT"ARE 16[146] POSSIBLE COLOUR #3'S" 3370 PRINT"BUT[157][157][157][184][184][184][145] ONLY BITS 0-2 GIVE 'COLOUR #3'" 3380 PRINT"AND THE BIT 3[146] TELLS THE VIDEO CHIP" 3390 PRINT"WHETHER THE CORRESPONDING SCREEN" 3391 E$(1)="[176][192][178][192][178][192][178][192][174]" 3392 E$(2)="[221] [221] [221] [221] [221]" 3393 E$(3)="[173][192][177][192][177][192][177][192][189]" 3400 PRINT"POSITION IS MULTI-COLOUR OR NOT!!":GOSUB63000 3401 PRINT"[147]"E$(1) 3402 PRINTE$(2)" _ A NYBBLE IN COLOUR MEMORY" 3403 PRINTE$(3) 3404 PRINT" ^ ^ ^ ^" 3405 PRINT" [221] COLOUR" 3406 PRINT" [221] # 3 " 3407 PRINT" [221]" 3408 PRINT" MULTI-BIT[146]":MS$=" BIT 3[146]":GOSUB63100:GOSUB63000 3410 PRINT"[147]YOU MAY HAVE NOTICED SOMETHING STRANGE." 3411 PRINT"WE KEEP SAYING THAT CHARACTER MEMORY" 3412 PRINT"STARTS AT 55296" 3413 PRINT"WE ALSO SAY THAT COLOUR MEMORY" 3414 PRINT"STARTS AT 55296[146]!!" 3415 PRINT"WELL..IF YOU PEEK AND POKE 55296" 3416 PRINT"YOU'LL GET COLOUR MEMORY[146] ONLY." 3417 PRINT"THE 'NORMAL' CHARACTER MEMORY" 3418 PRINT"AT 55296 ISN'T SO SIMPLE TO ACCESS!" 3419 PRINT"..BUT THAT'S ANOTHER STORY..":GOSUB63000 3420 PRINT"[147]LET'S TRY MULTI-COLOUR!":MS$="OK OK OK":GOSUB63100:GOSUB63000 3425 PRINT"[147]ABCDEFGHIJKLMNPQRSTUVWXYZ":GOSUB63000 3440 PRINT"NOW INTO MULTI-COLOUR MODE[146] WITH:" 3450 PRINT"V=53248:POKEV+22,PEEK(V+22)OR16":GOSUB63001 3460 V=53248:POKEV+22,PEEK(V+22)OR16 3470 PRINT"NOTHING CHANGED, RIGHT?" 3480 PRINT"THAT'S BECAUSE COLOUR MEMORY HAS " 3490 PRINT"BIT 3 = 0[146]!":GOSUB63001:PRINT"LET'S:" 3500 PRINT"FORI=0TO25:POKE55296+I,8+8*RND(1):NEXT" 3510 PRINT"SETTING THE 1ST 26 NYBBLES IN COL. MEM." 3520 PRINT"TO RANDOM NUMBERS FROM 8 TO 15,":PRINT"THEN BIT 3 = 1":GOSUB63001 3530 FORI=0TO25:POKE55296+I,8+8*RND(1):NEXT:GOSUB63000 3540 PRINT"[147]A B C D E F G H I J K L M ":V=53248:POKEV+35,1:POKEV+34,0 3550 FORI=0TO25STEP2:POKE55296+I,8+8*RND(1):NEXT:POKE53281,12:PRINT"" 3555 V=53248:POKEV+22,PEEK(V+22)OR16:GOSUB63000 3560 PRINT"LET'S PICK SOME COLOURS:" 3570 PRINT"FORI=0TO25:POKE55296+I,8+5:NEXT" 3580 PRINT"SET COLOUR #3 TO GREEN (GREEN=5)":GOSUB63001 3585 FORI=0TO25:POKE55296+I,13:NEXT 3590 PRINT"POKE V+35,0[146]..SET COLOUR #2 TO BLACK(0)":GOSUB63001:POKE53248+35,0 3600 PRINT"POKE V+34,1[146]..SET COLOUR #1 TO WHITE(1)":GOSUB63001:POKE53248+34,1 3610 PRINT"POKE V+33,2[146]..SET COLOUR #0 TO RED(2)":GOSUB63001:POKE53248+33,2 3620 GOSUB63000:PRINT"[147]":GOSUB60000:PRINT"[147] BIT MAP MODE" 3630 PRINT"IN REGISTER 17 OF THE VIDEO CHIP" 3640 PRINT"IS ANOTHER MAGIC BIT, BIT 5[146], WHICH" 3650 PRINT"PUTS THE C64 INTO BIT MAP MODE[146]." 3660 PRINT"POKE V+17,PEEK(V+17)OR32[146] DOES IT!":MS$=" V+17[146]":GOSUB63100 3665 GOSUB63000 3670 PRINT"[147]BIT WE WON'T..JUST YET..":GOSUB63000:PRINT"WELL..JUST ONCE:" 3680 GOSUB63000:V=53248:POKEV+17,PEEK(V+17)OR32:FORT=1TO1000:NEXT 3690 V=53248:POKEV+17,PEEK(V+17)AND223 3700 PRINT"[147]LET'S SEE HOW THAT[146] HAPPENS!" 3710 PRINT"TO DETERMINE WHAT GOES ON THE SCREEN" 3720 PRINT"AT SOME LOCATION 'K' (0<=K<=999)" 3730 PRINT"THE C64 DOES THE FOLLOWING:" 3740 PRINT"1[146]:GO DIRECTLY TO CHARACTER MEMORY" 3750 PRINT" TO LOCATIONS CM+8*K-CM+8*K+7" 3760 PRINT" AND GET 7 BYTES:P,P+1,...,P+7." 3770 PRINT"2[146]:GO TO SCREEN MEMORY[146], TO SM+K," 3780 PRINT" AND GET 1 BYTE, SAY N.":GOSUB63000 3790 PRINT"[147]ARMED WITH P[146],P+1[146],..,P+7[146] AND N[146]," 3800 PRINT"SET THE PIXELS TO 'COLOUR C0' OR TO" 3810 PRINT"'COLOUR C1' DEPENDING UPON WHETHER THE" 3820 PRINT"CORRESPONDING BIT IN THE P,P+1,...,P+7" 3830 PRINT"PIXEL PATTERN IS '0' OR '1'":MS$="0=C0[146] 1=C1[146]":GOSUB63100 3840 GOSUB63000:PRINT"[147]COLOUR C0..COLOUR C1?????":GOSUB63001 3850 PRINT"WE LOOK AT THE BYTE,N,TAKEN FROM" 3860 PRINT"SCREEN MEMORY[146]:" 3870 FORI=1TO3:PRINTE$(I)E$(I):NEXT 3880 PRINT" ^ ^ ^ ^ ^ ^ ^ ^" 3890 PRINT" [221] [221] [221] [221] COLOUR C0" 3900 PRINT" [221] [221] [221] [221]" 3910 PRINT"COLOUR C1" 3920 GOSUB63001:PRINT"NICE??":GOSUB63000:MS$="VERY NICE!":GOSUB63100:PRINT"[147]" 3930 GOSUB63000:PRINT"NOTE[157][157][157][157][184][184][184][184][145]:CHARACTER MEMORY[146] STILL GIVES" 3940 PRINT" THE 'PIXEL PATTERN', BUT" 3950 PRINT" SCREEN MEMORY[146] GIVES THE COLOURS!!" 3960 PRINT"FURTHERMORE..THE 8K BYTES IN CM[146]-CM+8191" 3970 PRINT"(CHARACTER MEMORY)..ARE SIMPLY...":GOSUB63001 3980 PRINT"LAID ON TOP OF THE SCREEN[146]!!":GOSUB63001 3990 PRINT"JUST POKE V+17,PEEK(V+17)OR32" 4000 MS$=" V+17[146]":GOSUB63100:GOSUB63000:PRINT"[147]":GOSUB63000 4010 PRINT"NOW, TO GET SOMETHING INTERESTING" 4020 PRINT"ON THE SCREEN IN BIT MAP MODE[146], WE" 4030 PRINT"MUST PUT GOOD LOOKING 'PIXEL PATTERNS'" 4040 PRINT"INTO CHARACTER MEMORY[146]." 4050 PRINT"HOW?":GOSUB63001 4060 PRINT"POKE GOOD STUFF INTO, SAY, LOCATIONS" 4070 PRINT"8192 TO 8192+8191 (8K'S WORTH), THEN" 4080 PRINT"TELL THE VIDEO CHIP TO CHANGE THE" 4090 PRINT"'NORMAL' LOCATION OF CHARACTER MEMORY[146]" 4100 PRINT"SO IT STARTS AT 8192!" 4110 PRINT"HOW?":MS$="I GIVE UP":GOSUB63100:GOSUB63000 4120 PRINT"[147]POKE V+24,(PEEK(V+24)AND15)OR128)" 4130 PRINT"WHICH SETS THE UPPER NYBBLE IN THE" 4140 PRINT"24'TH REGISTER TO 1000[146], WHILE LEAVING" 4150 PRINT"ALL THE LOWER BITS UNCHANGED..." 4160 PRINT"AND 1000[146]=8 (IN DECIMAL)" 4170 PRINT"AND 8*1024=8192[146]" 4180 PRINT"SO CM[146]=START OF CHARACTER MEMORY[146] IS" 4190 PRINT"NOW AT 8192[146]!!":MS$=" SIMPLE":GOSUB63100:GOSUB63000 4300 PRINT"[147]":MS$="AU REVOIR!":GOSUB63100:PRINT"":END 60000 REM INITIALIZE 60001 BT$="":FORI=1TO24:BT$=BT$+"":NEXT 60002 PT$="[158][176][192][192][192][192][192][192][192][192][192][192][174][157][157][157][157][157][157][157][157][157][157][157][157][221][221][157][157][157][157][157][157][157][157][157][157][157][157][173][178][192][192][192][192][192][192][192][192][178][189]" 60003 PT$=PT$+"[157][157][157][157][157][157][157][157][157][157][157][157][157][206][163][163][163][163][163][163][163][163][163][163][163][163][205][157][157][157][157][157][157][157][157][157][157][157][157][157][157][165]============[167]" 60004 PT$=PT$+"[157][157][157][157][157][157][157][157][157][157][157][157][157][157][208][207][163][163][163][163][163][163][163][163][163][163][208][207][145][145][145][145][157][157][157][157][157][157][157][157][157][157][157][157]" 60005 PT$=BT$+"[145][145][145][145][145][145]"+PT$+"[159]" 60007 ML$="" 60008 WD=40:CRT=1024 60009 W2=WD/2:W3=WD-1:W1$=MID$(STR$(WD),2):POKE53281,6:POKE53280,6:PRINT"" 60010 V=53248:FORI=0TO16:POKEV+I,0:NEXT 60011 POKEV+23,0:POKEV+29,0:FORI=0TO7:POKEV+39+I,0:NEXT 60020 RETURN 62000 GOSUB63000 62001 PRINTSD$CL$:PRINTCL$:PRINTCL$ 62003 RETURN 63000 PRINT"HIT RETURN[146] TO CONTINUE"; 63001 GETA$:IFA$<>""THEN63001 63002 GETA$:IFA$=""THEN63002 63003 RETURN 63100 FORT=1TO5:PRINTPT$MS$; 63101 PRINTPT$" "; 63102 PRINTPT$MS$;:NEXT 63103 PRINT"":RETURN 63900 SD$="":CL$="[146] [146]" 63901 SR$="" 63902 RETURN